home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Dr. Windows 3
/
dr win3.zip
/
dr win3
/
WINPROGS
/
WUNZ20SR.ZIP
/
SOUND.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-11
|
11KB
|
322 lines
#include "sound.h"
#include "wizunzip.h"
#include "helpids.h"
#include <mmsystem.h>
/* WizUnZip sound control module, sound.c.
* This module controls what sound WizUnZip makes after during or after extracting a file.
* All users can optionally produce a beep after unzipping. Users with Windows 3.1
* or Windows 3.0 + Multimedia extensions can play wave files.
* WizUnZip uses the presence of the DLL MMSYSTEM.DLL to determine whether MM
* capability is present. It further queries the number of wave devices in
* the system to see if wave playing hardware is present. This approach
* gives maximum system useability without causing Windows errors such as
* "Can't find dynalink!"
*/
#define SNDPLAYSOUND_ORD 2 /* sndPlaySound ordinal in MMSYSTEM.DLL */
#define WAVEOUTGETNUMDEVS_ORD 401 /* waveOutGetNumDevs ordinal */
#define MAXFILTERBUF 50
static char __based(__segname("STRINGS_TEXT")) szBeepOnFinish[] = "Beep";
static char __based(__segname("STRINGS_TEXT")) szMMSystemDll[] = "MMSYSTEM.DLL";
static char __based(__segname("STRINGS_TEXT")) szDfltWaveFile[] = "WIZUNZIP.WAV";
static char __based(__segname("STRINGS_TEXT")) szSoundNameKey[] = "SoundName"; /* key in .INI */
static char __based(__segname("STRINGS_TEXT")) szSoundOptKey[] = "SoundOption";
static char __based(__segname("STRINGS_TEXT")) szWaveBrowseTitle[] = "Browse Sound Files";
static char __based(__segname("STRINGS_TEXT")) gszFilter[MAXFILTERBUF] =
"Wave Files (*.wav)\0*.wav\0All Files (*.*)\0*.*\0\0";
static char *SoundOptsTbl[] = /* for .INI file */
{"none", "beep", "PlayDuring", "PlayAfter" };
static HINSTANCE hinstMMSystem; /* MMSystem DLL instance */
static FARPROC lpSndPlaySound; /* pointer to SndPlaySound() */
static FARPROC lpWaveOutGetNumDevs; /* pointer to WaveOutGetNumDevs() */
static BOOL CanPlayWave(void);
static WORD uSoundButtonSelected = IDM_SOUND_NONE; /* state of sound option */
static WORD uSoundButtonSelectedTmp; /* state of sound option while in dialog box */
/* Forward Refs
*/
static BOOL DoOpenFile(HWND hWnd, LPSTR lpDestFileName);
static BOOL CanPlayWave(void);
/* Test for Wave Playing Capability
*/
static BOOL CanPlayWave(void)
{
static bTestedForWave = FALSE; /* true if test for wave playing has been done */
static bCanPlayWave = FALSE; /* true if system can play wave */
int nPrevErrorMode; /* previous error mode */
if (bTestedForWave) /* deja vu ? */
return(bCanPlayWave);
bTestedForWave = TRUE;
nPrevErrorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX);
hinstMMSystem = LoadLibrary(szMMSystemDll);
SetErrorMode(nPrevErrorMode);
if (hinstMMSystem > HINSTANCE_ERROR)
{
/* If can't load the function which looks up no. wave out devices or
* number of wave output devices is zero, we can't play waves.
*/
if ((lpWaveOutGetNumDevs =
GetProcAddress(hinstMMSystem, MAKEINTRESOURCE(WAVEOUTGETNUMDEVS_ORD))) == NULL ||
(*lpWaveOutGetNumDevs)() == 0 ||
(lpSndPlaySound =
GetProcAddress(hinstMMSystem, MAKEINTRESOURCE(SNDPLAYSOUND_ORD))) == NULL)
{
FreeLibrary(hinstMMSystem); /* unload library */
}
else /* we're set to play waves */
{
bCanPlayWave = TRUE; /* flag that we can play waves */
}
}
return bCanPlayWave;
}
/* Migrate Sound Options translates the former beep-on-finish option into
* one of the first 2 of the 4 sound options.
*/
void MigrateSoundOptions(void)
{
UINT SoundOptsTableIndex;
GetProfileString(szAppName, szBeepOnFinish, szNo, lpumb->szBuffer, OPTIONS_BUFFER_LEN);
SoundOptsTableIndex = (UINT)(!lstrcmpi(lpumb->szBuffer, szNo) ? 0 : 1);
WritePrivateProfileString(szAppName, szLBSelectionKey,
SoundOptsTbl[SoundOptsTableIndex],
szWizUnzipIniFile);
}
/* Initialize Sound Options is called on WizUnZip start-up to read
* the sound option and sound name.
* Read the Sound Option to see if user wants beep, sound, or nothing.
* Read chosen sound name or wave file.
*/
void InitSoundOptions(void)
{
GetPrivateProfileString(szAppName, szSoundOptKey, SoundOptsTbl[0],
lpumb->szBuffer, OPTIONS_BUFFER_LEN,
szWizUnzipIniFile);
lpumb->szBuffer[255] = '\0'; /* force truncation */
for (uSoundButtonSelected = IDM_SOUND_NONE;
uSoundButtonSelected < IDM_SOUND_WAVE_AFTER &&
lstrcmpi(lpumb->szBuffer, SoundOptsTbl[uSoundButtonSelected-IDM_SOUND_NONE]) ;
uSoundButtonSelected++)
;
/* Do range check on sound option. Set to none if necessary.
*/
if (uSoundButtonSelected > IDM_SOUND_WAVE_AFTER ||
(uSoundButtonSelected > IDM_SOUND_BEEP &&
!CanPlayWave()))
uSoundButtonSelected = IDM_SOUND_NONE;
GetPrivateProfileString(szAppName, szSoundNameKey, szDfltWaveFile,
lpumb->szSoundName, WIZUNZIP_MAX_PATH,
szWizUnzipIniFile);
}
/* Play Sound During extraction, test, or display if requested.
* Don't use a default if nothing specified.
*/
void SoundDuring(void)
{
if (uSoundButtonSelected == IDM_SOUND_WAVE_DURING && CanPlayWave())
{
(*lpSndPlaySound)((LPSTR)lpumb->szSoundName, SND_ASYNC|SND_NOSTOP|SND_NODEFAULT);
}
}
/* Play Sound After extraction, test, or display if requested.
*/
void SoundAfter(void)
{
switch (uSoundButtonSelected) {
case IDM_SOUND_BEEP:
MessageBeep(1);
break;
case IDM_SOUND_WAVE_AFTER:
if (CanPlayWave())
(*lpSndPlaySound)((LPSTR)lpumb->szSoundName, SND_ASYNC|SND_NOSTOP);
break;
}
}
/* Do File Open Dialog calls the common dialog function GetOpenFileName()
* to browse and select a table file.
*/
static BOOL DoOpenFile(HWND hWnd, LPSTR lpDestFileName)
{
BOOL fRetCode = FALSE; /* assume failure */
DWORD dwExtdError;
lpumb->wofn.lStructSize = sizeof(OPENFILENAME);
lpumb->wofn.hwndOwner = (HWND)hWnd;
lpumb->wofn.hInstance = (HANDLE)NULL;
lpumb->wofn.lpstrFilter = gszFilter;
lpumb->wofn.lpstrCustomFilter = (LPSTR)NULL;
lpumb->wofn.nMaxCustFilter = 0L;
lpumb->wofn.nFilterIndex = 1L;
lpumb->wofn.lpstrFile = lpDestFileName;
lpDestFileName[0] = '\0';
lpumb->wofn.nMaxFile = (DWORD)WIZUNZIP_MAX_PATH;
lpumb->wofn.lpstrFileTitle = (LPSTR)NULL;
lpumb->wofn.nMaxFileTitle = 0;
lpumb->wofn.lpstrInitialDir = (LPSTR)NULL;
lpumb->wofn.lpstrTitle = (LPSTR)szWaveBrowseTitle;
lpumb->wofn.Flags = OFN_HIDEREADONLY|
OFN_PATHMUSTEXIST|
OFN_FILEMUSTEXIST|
OFN_NOCHANGEDIR|
OFN_SHOWHELP ;
lpumb->wofn.nFileOffset = 0;
lpumb->wofn.nFileExtension = 0;
lpumb->wofn.lpstrDefExt = "WAV";
lpumb->wofn.lCustData = 0L;
lpumb->wofn.lpfnHook = (FARPROC)NULL;
lpumb->wofn.lpTemplateName = (LPSTR)NULL;
if ( GetOpenFileName( &(lpumb->wofn) ) )
{
HFILE hFile;
OFSTRUCT ofstruct;
hFile=OpenFile(lpumb->wofn.lpstrFile, &ofstruct, OF_EXIST);
if (hFile != -1)
{
fRetCode = TRUE;
}
/* NOTE!!! On a closed system (ie, not running on a network)
* this OpenFile call should NEVER fail. This because we passed in the
* OFN_FILEMUSTEXIST flag to CD. However, on a network system,
* there is a *very* small chance that between the time CD's checked
* for existance of the file and the time the call to OpenFile
* was made here, someone else on the network has deleted the file.
* MORAL: ALWAYS, ALWAYS, ALWAYS check the return code from your
* call to OpenFile() or _lopen.
*/
}
else /* dialog failed */
{
dwExtdError = CommDlgExtendedError(); /* get error code */
}
return(fRetCode); /* return indication */
}
/****************************************************************************
FUNCTION: SoundProc(HWND, unsigned, WORD, LONG)
PURPOSE: Processes messages for "Sound Options" dialog box of